package com.jt.service;

import com.jt.vo.ImageVO;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

@Service
public class FileServiceImpl implements FileService {
    //定义根目录
    private String rootDir = "F:/project3/images";
    //定义图片服务器网址
    private String rootUrl = "http://image.jt.com";

    /**
     * 思路：
     * 1.校验文件是否为图片 校验图片类型
     * 2.防止文件为恶意程序  木马.exe.jpg
     * 3.分目录存储 按照时间维度划分
     * 4.防止文件重名 UUID
     */
    @Override
    public ImageVO upload(MultipartFile file) {
        //1.获取图片名称，全部转为小写
        String fileName = file.getOriginalFilename().toLowerCase();//toLowerCase() 转小写
        if (!fileName.matches("^.+\\.(jpg|png|gif)$")) {//校验图片类型  matches过滤条件
            return null;
        }
        //2.通过校验宽度和高度判断是否为图片 bufferedImage图片包装对象
        try {
            //2.图片IO流，读取，文件输出流
            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
            int width = bufferedImage.getWidth();//获取宽
            int height = bufferedImage.getHeight();//获取高
            if (width == 0 || height == 0) {//判断宽高为0，说明不是图片
                return null;
            }
            //3.实现分目录存储
            //按日期分存目录-注意注意注意-"/yyy/MM/dd/"必须/  /全包裹
            String datePath = new SimpleDateFormat("/yyy/MM/dd/").format(new Date());
            //F://project3/images/2025/11/11/
            //图片文件目录全路径=根目录+日期路径
            String fileDir = rootDir + datePath;
            //将文件目录对象化
            File dirFile = new File(fileDir);
            if (!dirFile.exists()) {//判断若文件目录不存在，则自动创建多级目录
                dirFile.mkdirs();
            }
            //4.动态生成UUID
            String UUID = java.util.UUID.randomUUID().toString();
            //通过索引，在文件名称尾部追加"."
            int index = fileName.lastIndexOf(".");
            //文件类型=文件名称后面的子链index
            String fileType = fileName.substring(index);
            //再把图片文件名称通过UUID构成虚拟名称
            fileName = UUID + fileType;
            //5.实现文件上传 准备文件的全路径
            String path = fileDir + fileName;
            file.transferTo(new File(path));//transfer文件转移到新的path
            //准备ImageVO数据返回 /2021/11/11/uuid.jpg
            //封装VO对象-virtualPath虚拟路径=日期路径+文件名称
            String virtualPath = datePath + fileName;
            //按照要求封装图片网络地址
            //http://image.jt.com/2021/11/11/uuid.jpg;
            String urlPath = rootUrl + virtualPath;//网址路径=根路径+虚拟路径
            System.out.println(urlPath);//打印网址路径
            //创建图片VO对象传入参数虚拟路径/网址路径/文件名称
            ImageVO imageVO = new ImageVO(virtualPath, urlPath, fileName);
            return imageVO;//返回图片VO对象
        } catch (IOException e) {
            e.printStackTrace();
            //一般条件下为了不影响代码结构，将检查异常，转化为运行时异常
            throw new RuntimeException(e);
        }
    }

    @Override
    public void deleteFile(String virtualPath) {
        //本地路径=根目录+虚拟路径
        String localPath = rootDir + virtualPath;
        //将本地路径实例化为file对象
        File file = new File(localPath);
        if (file.exists()) {//如果文件存在，则删除
            file.delete();
        }
    }

}
